peerJ期刊探索
开放获取的期刊--PeerJ由Peter Binfield(曾在PLOS ONE任职)和Jason Hoyt(曾为Mendeley的首席科学家)于2012年6月份正式创立。
编辑阵容。其实一个期刊的论文质量,很大程度上取决于编辑的阵容。PeerJ目前的1619位编辑(截止至2018/02)队伍,的确堪称豪华,其中亦不乏诸多诺贝尔得主。
公开审稿过程。我认为这一点是除了较低的发表费用外,PeerJ胜过PLOS ONE的另一大举措。PeerJ官网介绍超过80%的作者选择公开审稿过程,即读者可以浏览下载该论文从投稿、修改、编辑意见、审者意见和作者回复信等所有有关审稿过程的内容。
使用爬虫批量解析发表的所有文章
其发表的所有文章的url很有规律
https://peerj.com/articles/1/
https://peerj.com/articles/2
····························
https://peerj.com/articles/4400
https://peerj.com/articles/4401(404 error)
首先看投稿,审稿,发表时间,的html源代码
<dl class="article-dates">
<dt>Published</dt>
<dd><time itemprop="datePublished">2013-02-12</time></dd>
<dt>Accepted</dt>
<dd><time data-itemprop="dateAccepted">2012-11-21</time></dd>
<dt>Received</dt>
<dd><time itemprop="dateCreated">2012-11-13</time></dd>
</dl>
然后看看文章所属领域及关键词的html源代码
<dl class="article-subjects">
<dt>Subject Areas</dt>
<dd>
<a class="subject" itemprop="about" href="/subjects/?filter=Biochemistry">Biochemistry</a>, <a class="subject" itemprop="about" href="/subjects/?filter=Bioinformatics">Bioinformatics</a>, <a class="subject" itemprop="about" href="/subjects/?filter=Biophysics">Biophysics</a>, <a class="subject" itemprop="about" href="/subjects/?filter=Computational%20Biology">Computational Biology</a>
</dd>
<dt>Keywords</dt>
<dd>
<span class="kwd" itemprop="keywords">Protein structure</span>, <span class="kwd" itemprop="keywords">Protein loop</span>, <span class="kwd" itemprop="keywords">Protein structure prediction</span>, <span class="kwd" itemprop="keywords">Protein loop structure</span>, <span class="kwd" itemprop="keywords">Protein loop structure prediction</span>, <span class="kwd" itemprop="keywords">Protein</span>, <span class="kwd" itemprop="keywords">Loop stretch</span>, <span class="kwd" itemprop="keywords">Loop span</span>
</dd>
</dl>
还可以看看文章的作者列表,发现实在是太复杂了,懒得解析。就看看编辑列表的html源代码
<dl class="article-editors">
<dt>Academic Editor</dt>
<dd itemprop="editor" itemscope="itemscope" itemtype="http://schema.org/Person"><a itemprop="url" href="editor-1" class="contrib" data-jats-contrib-type="editor"><span class="name" itemprop="name"><span class="given-names" itemprop="givenName">Scotty</span> <span class="surname" itemprop="familyName">Butcher</span></span></a></dd>
</dl>
另外值得注意的URL,比如:
https://peerj.com/articles/89/reviews/ 这个就选择不公开review细节。
https://peerj.com/articles/1/reviews/ 这个就公开了.
https://peerj.com/articles/4400/editor-1
https://peerj.com/articles/1/editor-1
投稿时间及接收时间可以看杂志社效率,领域分析可以保证自己没投错,关键词可以做词云。
首先一一访问每篇文章获取关键信息
看懂下面代码的前提是 了解基础R语言语法,以及 rvest
的用法,了解html的DOM基本结构,以及提前查看了自己需要的信息情况。
library(rvest)
peerData <- lapply(1:4000,function(i){
url=paste('https://peerj.com/articles/',i,'/',sep="")
cat(paste0('Now processing the number ',i,' articel.\n'))
fit<-try(web <- read_html(url),silent=TRUE)
if('try-error' %in% class(fit)){
cat('HTTP error 404\n')
}else{
date <- web %>% html_nodes('dl.article-dates dd time') %>% html_text()
editor_ <- web %>% html_nodes('dl.article-editors dd a span') %>% html_text()
subject_ <- web %>% html_nodes('dl.article-subjects dd a') %>% html_text()
editor = editor_[1]
subject=paste(subject_,collapse=":")
return(c(i,date,editor,subject))
}
})
save(peerData,file = 'peerData-1-4000.Rdata')
这个代码写的有点粗糙,4000篇文章访问还是很慢的,约耗时3小时,可以加入并行的语法。
然后进行简单统计并且绘图
load(file = 'peerData-1-4000.Rdata')
dim(peerData)
# [1] 3383 6
colnames(peerData)=c('id','Pdate','Adate','Rdate','editor','subject')
peerData=as.data.frame(peerData)
head(peerData)
# id Pdate Adate Rdate editor
# 1 1 2013-02-12 2012-11-21 2012-11-13 Walter de Azevedo Jr
# 2 2 2013-02-12 2012-12-01 2012-11-13 Emanuele Paci
# 3 3 2013-02-12 2012-12-03 2012-11-13 Mark Mattson
# 4 4 2013-02-19 2012-12-04 2012-11-13 Dee Carter
# 5 5 2013-02-12 2012-12-05 2012-11-14 Annalisa Pastore
# 6 6 2013-02-12 2012-12-08 2012-11-13 Zhihong Xu
# subject
# 1 Biochemistry:Bioinformatics:Biophysics:Computational Biology
# 2 Biochemistry:Bioinformatics:Biophysics:Computational Biology:Molecular Biology
# 3 Neuroscience
# 4 Microbiology:Molecular Biology:Mycology
# 5 Biochemistry:Biophysics
# 6 Soil Science
tail(peerData)
# id Pdate Adate Rdate editor
# 3378 3400 2017-05-31 2017-05-10 2017-01-20 Marion R<U+00F6>der
# 3379 3401 2017-05-30 2017-05-10 2016-12-19 Erika Braga
# 3380 3402 2017-05-30 2017-05-10 2016-10-17 Kenneth De Baets
# 3381 3403 2017-06-20 2017-05-10 2016-11-16 Hans-Dieter Sues
# 3382 3404 2017-05-30 2017-05-11 2017-03-17 Lydia Hopper
# 3383 3405 2017-06-27 2017-05-11 2016-10-17 Antonio Palaz<U+00F3>n-Bru
# subject
# 3378 Bioinformatics:Genomics:Plant Science
# 3379 Ecology:Genetics:Parasitology
# 3380 Entomology:Paleontology:Zoology
# 3381 Evolutionary Studies:Paleontology
# 3382 Animal Behavior:Conservation Biology
# 3383 Diabetes and Endocrinology:Evidence Based Medicine:Nephrology
editors <- as.data.frame(sort(table(peerData$editor),decreasing = T))
dim(editors)
# [1] 682 2
head(editors)
# Var1 Freq
# 1 Mar<U+00ED>a <U+00C1>ngeles Esteban 93
# 2 Jafri Abdullah 60
# 3 James Reimer 56
# 4 Robert Toonen 49
# 5 Donald Kramer 42
# 6 Dezene Huber 35
freqs=as.data.frame(sort(table(editors$Freq),decreasing = T))
dim(freqs)
# [1] 38 2
head(freqs)
# Var1 Freq
# 1 1 203
# 2 2 134
# 3 3 82
# 4 4 53
# 5 5 41
# 6 6 34
library(ggplot2)
ggplot(freqs,aes(Var1,Freq)) + geom_bar(stat = "identity") +
labs(x = "number of papers edited by each editor", y = "number of editors") +
theme(panel.background=element_rect(fill='transparent')) +
ylim(0,200) +
geom_text(mapping = aes(label = Freq),size=4,vjust=-1,color = "black")
可以看到,截止至 2017-06-27 ,已经有 682 个编辑已经干活了。在干活的这些编辑里面有少数几个特别勤奋,居然接近100篇了。
分析一下审稿速度
pd=as.Date(as.character(peerData$Pdate))
ad=as.Date(as.character(peerData$Adate))
rd=as.Date(as.character(peerData$Rdate))
plot(pd~rd)
# 可以看到只有极少数文章投稿后很久才得到被接受。
durDays=as.numeric(ad-rd)
fivenum(durDays)
# [1] -21 60 87 125 858
# 大部分文章在两三个月期间被审核完毕。
boxplot(durDays)
# 搞笑的是有两个文章还没投稿就被接受了,应该是数据库录入错误。
peerData[ad-rd < 1,]
# id Pdate Adate Rdate editor
# 1102 1108 2015-08-04 2015-06-26 2015-06-26 Andrew Farke
# 1548 1554 2016-01-14 2015-12-11 2016-01-1 Mike Thompson
# subject
# 1102 Paleontology:Taxonomy
# 1548 Clinical Trials:Health Policy:Translational Medicine
最后看一下领域分布
这里需要考虑是否把属于多个领域的同一篇文章的权重降低,比如一篇文章属于5个领域,那么每个领域就只分到了0.2个文章。 我这里就先探索一下不降低权重的方法。
为了保证绘图的美观,这里只展现排名前20的领域。
subjects <- as.data.frame(sort(table(strsplit(paste0(peerData$subject,collapse = ':'),':')[[1]]),decreasing = T))
subjects <- head(subjects,20)
head(subjects)
# Var1 Freq
# 1 Ecology 793
# 2 Zoology 516
# 3 Evolutionary Studies 452
# 4 Marine Biology 417
# 5 Biodiversity 414
# 6 Conservation Biology 337
library(ggplot2)
ggplot(subjects,aes(reorder(Var1,as.numeric(Freq)),Freq)) +
geom_bar(stat = "identity") + coord_flip() +
labs(x = "", y = "",title="Proportion of Subjects") +
theme(panel.background=element_rect(fill='transparent')) +
geom_text(mapping = aes(label = Freq),size=3,hjust=1,color = "white")
写在最后
分析期刊其实是一件很有趣的事情,尤其是对初学者来说,可以学的非常多。
比如还可以在爬取数据的时候解析收集每篇文章被引用情况,这样就可以计算杂志的影响因子,然后所有的分析,都是可以根据年来区分开来,看看有没有时间尺度上的变化规律。而且可以爬取关键词和摘要来进行词云分析及可视化。当然了,开放性期刊全文都是公开的,也已爬取全文进行各种高级分析。这个时候,代码往往不是瓶颈。
这里面的代码都是可以复现的,欢迎大家深入挖掘和研究,跟我交流,我的邮箱是 jmzeng1314@163.com
期待你们的来信。